home *** CD-ROM | disk | FTP | other *** search
/ The Atari Compendium / The Atari Compendium (Toad Computers) (1994).iso / files / prgtools / mint / network / lattice / portlib.lzh / PORTLIB / TCATTR.C < prev    next >
Encoding:
C/C++ Source or Header  |  1994-12-09  |  6.6 KB  |  221 lines

  1. /*
  2. Public domain termios tc[get|set]attr() for the MiNT library
  3. 10 October 1993 entropy@terminator.rs.itd.umich.edu -- first attempt
  4. */
  5.  
  6. #include <mintbind.h>
  7. #include <types.h>
  8. #include <param.h>
  9. #include <errno.h>
  10. #include <file.h>
  11. #include <ioctl.h>
  12. #include <unistd.h>
  13. #include <types.h>
  14. #include <termios.h>
  15.  
  16. #define VTIME_MS    100  /* count in .1 seconds */
  17.  
  18. extern int __mint;
  19.  
  20. int
  21. _tcgetattr(fd, stp)
  22.   int fd;
  23.   struct termios *stp;
  24. {
  25.   struct sgttyb sg;
  26.   struct tchars t;
  27.   struct ltchars lt;
  28.   short flags;
  29.   unsigned short vmin[2];
  30.   long state, r;
  31.  
  32.   r = Fcntl((short) fd, (long) &sg, TIOCGETP);
  33.   if (r < 0) {
  34.     errno = (int) -r;
  35.     return -1;
  36.   }
  37.   r = Fcntl((short) fd, (long) &t, TIOCGETC);
  38.   if (r < 0) {
  39.     errno = (int) -r;
  40.     return -1;
  41.   }
  42.   r = Fcntl((short) fd, (long) <, TIOCGLTC);
  43.   if (r < 0) {
  44.     errno = (int) -r;
  45.     return -1;
  46.   }
  47.   r = Fcntl((short) fd, (long) &flags, TIOCGFLAGS);
  48.   if (r < 0) {
  49.     flags = 0;
  50.   }
  51.   r = Fcntl((short) fd, (long) &state, TIOCGSTATE);
  52.   if (r < 0) {
  53.     state = 0;
  54.   }
  55.   stp->c_iflag = (tcflag_t) (((flags & _TF_BRKINT) ? BRKINT : 0)
  56.             | ((sg.sg_flags & CRMOD) ? ICRNL : 0)
  57.             | ((sg.sg_flags & (EVENP | ODDP)) ? INPCK :
  58.              ((sg.sg_flags & RAW) ? 0 : IGNPAR)) /*keep stty happy*/
  59.             | ((sg.sg_flags & TANDEM) ? (IXON | IXOFF) : 0)
  60.             | ((sg.sg_flags & RAW) ? 0 : IXON));
  61.   stp->c_oflag = (tcflag_t) (sg.sg_flags & RAW) ? 0 : OPOST;
  62.   stp->c_cflag = (tcflag_t) (CREAD
  63.             | ((flags & _TF_CAR) ? 0 : CLOCAL)
  64.             | ((state & _TS_HPCL) ? HUPCL : 0)
  65.             | (((flags & _TF_STOPBITS) == _TF_2STOP) ? CSTOPB : 0)
  66.             | (flags & _TF_CHARBITS)
  67.             | ((sg.sg_flags & _RTSCTS) ? CRTSCTS : 0)
  68.             | ((sg.sg_flags & EVENP) ? PARENB : 0)
  69.             | ((sg.sg_flags & ODDP) ? (PARENB | PARODD) : 0));
  70.   stp->c_lflag = (tcflag_t) ((sg.sg_flags & (TOSTOP | NOFLSH | ECHOCTL))
  71.             | ((sg.sg_flags & ECHO) ? (ECHO | ECHOE | ECHOK) : 0)
  72.             | ((sg.sg_flags & XKEY) ? IEXTEN : 0)
  73.             | ((sg.sg_flags & RAW)
  74.                 ? 0 
  75.                 : ISIG | (sg.sg_flags & CBREAK ? 0 : ICANON)));
  76.   stp->_c_ispeed = (speed_t) sg.sg_ispeed;
  77.   stp->_c_ospeed = (speed_t) sg.sg_ospeed;
  78.   stp->c_cc[VEOF]    = (cc_t) t.t_eofc;
  79.   stp->c_cc[VEOL]    = (cc_t) t.t_brkc;
  80.   stp->c_cc[VERASE]    = (cc_t) sg.sg_erase;
  81.   stp->c_cc[VINTR]    = (cc_t) t.t_intrc;
  82.   stp->c_cc[VKILL]    = (cc_t) sg.sg_kill;
  83.   stp->c_cc[VQUIT]    = (cc_t) t.t_quitc;
  84.   stp->c_cc[VSUSP]    = (cc_t) lt.t_suspc;
  85.   stp->c_cc[VSTART]    = (cc_t) t.t_startc;
  86.   stp->c_cc[VSTOP]    = (cc_t) t.t_stopc;
  87.   r = Fcntl((short) fd, (long) &vmin, TIOCGVMIN);
  88.   if (r < 0) {
  89.     stp->c_cc[VMIN]    = (cc_t) 1;
  90.     stp->c_cc[VTIME]    = (cc_t) 0;
  91.   } else {
  92.     if (vmin[1]) {
  93.       stp->c_cc[VMIN]    = (cc_t) 0;
  94.       stp->c_cc[VTIME]    = (cc_t) (vmin[1] >= 0xff*VTIME_MS) ? 0xff : vmin[1]/VTIME_MS;
  95.     } else {
  96.       stp->c_cc[VMIN]    = (cc_t) (vmin[0] >= 0xff) ? 0xff : vmin[0];
  97.       stp->c_cc[VTIME]    = (cc_t) 0;
  98.     }
  99.   }
  100.   stp->c_cc[VLNEXT]    = (cc_t) lt.t_lnextc;
  101.   stp->c_cc[VWERASE]    = (cc_t) lt.t_werasc;
  102.   stp->c_cc[VDSUSP]    = (cc_t) lt.t_dsuspc;
  103.   stp->c_cc[VREPRINT]    = (cc_t) lt.t_rprntc;
  104.   stp->c_cc[VFLUSHO]    = (cc_t) lt.t_flushc;
  105.   return 0;
  106. }
  107.  
  108. int
  109. _tcsetattr(fd, action, stp)
  110.   int fd;
  111.   int action;
  112.   const struct termios *stp;
  113. {
  114.   struct sgttyb sg;
  115.   struct tchars t;
  116.   struct ltchars lt;
  117.   short flags, state;
  118.   unsigned short vmin[2];
  119.   long bits[2], r;
  120.  
  121.   r = Fcntl((short) fd, (long) &sg, TIOCGETP);
  122.   if (r < 0) {
  123.     errno = (int) -r;
  124.     return -1;
  125.   }
  126.   r = Fcntl((short) fd, (long) <, TIOCGLTC);
  127.   if (r < 0) {
  128.     errno = (int) -r;
  129.     return -1;
  130.   }
  131.   sg.sg_flags &= ~(CRMOD | TANDEM | _RTSCTS | EVENP | ODDP | TOSTOP 
  132.             | NOFLSH | ECHOCTL | RAW | CBREAK | ECHO | XKEY);
  133.   sg.sg_flags |= (((stp->c_iflag & ICRNL) ? CRMOD : 0)
  134.             | (((stp->c_iflag & (IXON | IXOFF)) == (IXON | IXOFF)) ? TANDEM : 0)
  135.             | ((stp->c_cflag & CRTSCTS) ? _RTSCTS : 0));
  136.   flags = ((stp->c_cflag & CSTOPB) ? _TF_2STOP : _TF_1STOP) |
  137.         ((stp->c_cflag & CLOCAL) ? 0 : _TF_CAR) |
  138.         ((stp->c_iflag & BRKINT) ? _TF_BRKINT : 0) |
  139.         (stp->c_cflag & CSIZE);
  140.   state = (stp->c_cflag & HUPCL) ? _TS_HPCL : 0;
  141.   sg.sg_flags |= ((stp->c_cflag & PARENB)
  142.             ? ((stp->c_cflag & PARODD) ? ODDP : EVENP)
  143.             : 0);
  144.   sg.sg_flags |= ((stp->c_lflag & (TOSTOP | NOFLSH | ECHOCTL | ECHO))
  145.             | ((stp->c_lflag & IEXTEN) ? XKEY : 0)
  146.             | ((stp->c_lflag & ISIG)
  147.                ? (stp->c_lflag & ICANON ? 0 : CBREAK) : RAW));
  148.   sg.sg_ispeed = (char) stp->_c_ispeed;
  149.   sg.sg_ospeed = (char) stp->_c_ospeed;
  150.   t.t_eofc         = (char) stp->c_cc[VEOF];
  151.   t.t_brkc        = (char) stp->c_cc[VEOL];  
  152.   sg.sg_erase        = (char) stp->c_cc[VERASE];
  153.   t.t_intrc        = (char) stp->c_cc[VINTR];
  154.   sg.sg_kill        = (char) stp->c_cc[VKILL];
  155.   t.t_quitc        = (char) stp->c_cc[VQUIT];
  156.   lt.t_suspc        = (char) stp->c_cc[VSUSP];
  157.   t.t_startc        = (char) stp->c_cc[VSTART];
  158.   t.t_stopc        = (char) stp->c_cc[VSTOP];
  159.   if (stp->c_cc[VMIN]) {
  160.   /* have to ignore VTIME when VMIN is set, some programs rely on it... */
  161.     vmin[0]        = (unsigned char) stp->c_cc[VMIN];
  162.     vmin[1]        = 0;
  163.   } else {
  164.     vmin[0]        = (unsigned char) 1;
  165.     vmin[1]        = (unsigned short) stp->c_cc[VTIME] * VTIME_MS;
  166.   }
  167.   lt.t_lnextc        = (char) stp->c_cc[VLNEXT];
  168.   lt.t_werasc        = (char) stp->c_cc[VWERASE];
  169.   lt.t_dsuspc        = (char) stp->c_cc[VDSUSP];
  170.   lt.t_rprntc        = (char) stp->c_cc[VREPRINT];
  171.   lt.t_flushc        = (char) stp->c_cc[VFLUSHO];
  172.   switch (action)
  173.   {
  174.     case TCSAFLUSH:
  175.       tcflush(fd, TCIFLUSH);
  176.       /* fall through */
  177.     case TCSADRAIN:
  178.       r = Fcntl((short) fd, (long) &sg, __mint < 0x10b ? TIOCSETN : TIOCSETP);
  179.       if (r < 0) {
  180.         errno = (int) -r;
  181.         return -1;
  182.       }
  183.       break;
  184.     case TCSANOW:
  185.       r = Fcntl((short) fd, (long) &sg, TIOCSETN);
  186.       if (r < 0) {
  187.         errno = (int) -r;
  188.         return -1;
  189.       }
  190.       break;
  191.     default:
  192.       errno = EINVAL;
  193.       return -1;
  194.   }
  195.   r = Fcntl((short) fd, (long) &t, TIOCSETC);
  196.   if (r < 0) {
  197.     errno = (int) -r;
  198.     return -1;
  199.   }
  200.   r = Fcntl((short) fd, (long) <, TIOCSLTC);
  201.   if (r < 0) {
  202.     errno = (int) -r;
  203.     return -1;
  204.   }
  205.   bits[0] = (unsigned)flags;
  206.   bits[1] = _TF_STOPBITS | _TF_CHARBITS | _TF_CAR | _TF_BRKINT;
  207.   r = Fcntl((short) fd, (long) &bits, TIOCSFLAGSB);
  208.   if (r < 0) {
  209.     short sflags = 0;
  210.     (void) Fcntl((short) fd, (long) &sflags, TIOCGFLAGS);
  211.     sflags &= ~(_TF_STOPBITS | _TF_CHARBITS);
  212.     sflags |= flags & (_TF_STOPBITS | _TF_CHARBITS);
  213.     (void) Fcntl((short) fd, (long) &sflags, TIOCSFLAGS);
  214.   }
  215.   (void) Fcntl((short) fd, (long) &vmin, TIOCSVMIN);
  216.   bits[0] = (unsigned)state;
  217.   bits[1] = _TS_HPCL;
  218.   (void) Fcntl((short) fd, (long) &bits, TIOCSSTATEB);
  219.   return 0;
  220. }
  221.